#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "stdio.h"

// 定义事件标志
#define BIT_0 (1 << 0) // 事件位 0
#define BIT_1 (1 << 1) // 事件位 1

// 定义事件组句柄
EventGroupHandle_t xEventGroup;

// 任务0：设置事件标志
void vTaskSetEvent0(void *pvParameters)
{
    for (;;)
    {
        // 模拟一些操作
        vTaskDelay(pdMS_TO_TICKS(3000));

        // 设置事件位 BIT_0
        printf("任务0：设置事件位 BIT_0 \n");
        xEventGroupSetBits(xEventGroup, BIT_0);
    }
}
// 任务1：设置事件标志
void vTaskSetEvent1(void *pvParameters)
{
    for (;;)
    {
        // 模拟一些操作
        vTaskDelay(pdMS_TO_TICKS(2000));

        // 设置事件位  BIT_1
        printf("任务1：设置事件位  BIT_1\n");
        xEventGroupSetBits(xEventGroup, BIT_1);
    }
}

// 任务2：等待事件标志
void vTaskWaitEvent(void *pvParameters)
{
    EventBits_t uxBits;
    for (;;)
    {
        // 等待事件位 BIT_0 和 BIT_1 都被设置，最大等待时间为5000ms
        uxBits = xEventGroupWaitBits(
            xEventGroup,   // 事件组句柄
            BIT_0 | BIT_1, // 等待的事件位
            pdTRUE,        // 清除被满足的事件位
            pdFALSE,       // 必须等待所有指定的事件位
            portMAX_DELAY  // 永久等待
        );

        // 检查是否成功等到了所有事件位
        if ((uxBits & (BIT_0)) == (BIT_0))
        {
            printf("任务2：成功等到事件位 BIT_0\n");
        }
        if ((uxBits & (BIT_1)) == BIT_1)
        {
            printf("任务2：成功等到事件位 BIT_1\n");
        }
    }
}

// 主函数
int app_main(void)
{
    // 创建事件组
    xEventGroup = xEventGroupCreate();
    if (xEventGroup == NULL)
    {
        printf("事件组创建失败\n");
        while (1)
            ;
    }

    // 创建任务1：设置事件标志
    xTaskCreate(vTaskSetEvent0, "TaskSetEvent0", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    xTaskCreate(vTaskSetEvent1, "TaskSetEvent1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    // 创建任务2：等待事件标志
    xTaskCreate(vTaskWaitEvent, "TaskWaitEvent", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    // 如果代码到达这里，说明启动调度器失败
    for (;;)
    {
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
    return 0;
}
